package com.info33.platform.common.util;

import com.dd.plist.*;
//import com.info33.platform.app.utils.PNGConverter;
import com.info33.platform.common.constant.CustomizeYaml;
import com.info33.platform.doc.controller.DocFileController;
//import org.apkinfo.api.util.AXmlResourceParser;
//import org.apkinfo.api.util.XmlPullParser;
//import org.apkinfo.api.util.XmlPullParserException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipInputStream;

/**
 * @Author jijunyu
 * @Date 2022/12/27
 */
public class AppUtil {

    @Autowired
    private DocFileController doc;

    //  拷贝图标
    public static Boolean saveBit(String Icon, InputStream in, String iconpath)  {
        ZipInputStream zin = null;
        boolean flag = true;
        try {
            //  访问apk 里面的文件
            zin = new ZipInputStream(in);
            ZipEntry ze;
            while ((ze = zin.getNextEntry()) != null) {
                if (ze.getName().equals(Icon)) {
                    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                    //创建一个Buffer字符串
                    byte[] buffer = new byte[1024];
                    //每次读取的字符串长度，如果为-1，代表全部读取完毕
                    int len = 0;
                    //使用一个输入流从buffer里把数据读取出来
                    while ((len = in.read(buffer)) != -1) {
                        //用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
                        outStream.write(buffer, 0, len);
                    }
                    //关闭输入流
                    in.close();
                    //把outStream里的数据写入内存

                    //得到图片的二进制数据，以二进制封装得到数据，具有通用性
                    byte[] data = outStream.toByteArray();
                    //new一个文件对象用来保存图片，默认保存当前工程根目录
                    File imageFile = new File(iconpath);
                    //创建输出流
                    FileOutputStream fileOutStream = new FileOutputStream(imageFile);
                    //写入数据
                    fileOutStream.write(data);
                    // System.out.println("拷贝结束");
                    fileOutStream.close();
                    outStream.close();
                    break;
                }
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                zin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return  flag;
    }

//    /**
//     * 解析 IPA 文件
//     * @param is 输入流
//     * @return Map<String, Object>
//     */
//    public static Map<String, Object> analyzeIpa(InputStream is,InputStream is2,CustomizeYaml yaml) {
//        Map<String, Object> resultMap = new HashMap<>();
//        try {
//            ZipInputStream zipIs = new ZipInputStream(is);
//            ZipInputStream zipIs2 = new ZipInputStream(is2);
//            ZipEntry ze;
//            ZipEntry ze2;
//            InputStream infoIs = null;
//            NSDictionary rootDict = null;
//            String icon = null;
//            while ((ze = zipIs.getNextEntry()) != null) {
//                if (!ze.isDirectory()) {
//                    String name = ze.getName();
//                    // 读取 info.plist 文件
//                    // FIXME: 包里可能会有多个 info.plist 文件！！！
//                    if (name.contains(".app/Info.plist")) {
//                        ByteArrayOutputStream abos = new ByteArrayOutputStream();
//                        int chunk = 0;
//                        byte[] data = new byte[256];
//                        while(-1 != (chunk = zipIs.read(data))) {
//                            abos.write(data, 0, chunk);
//                        }
//                        infoIs = new ByteArrayInputStream(abos.toByteArray());
//
//                        rootDict = (NSDictionary) PropertyListParser.parse(infoIs);
//                        NSDictionary iconDict = (NSDictionary) rootDict.get("CFBundleIcons");
//                        //获取图标名称
//                        while (null != iconDict) {
//                            if (iconDict.containsKey("CFBundlePrimaryIcon")) {
//                                NSDictionary CFBundlePrimaryIcon = (NSDictionary) iconDict.get("CFBundlePrimaryIcon");
//                                if (CFBundlePrimaryIcon.containsKey("CFBundleIconFiles")) {
//                                    NSArray CFBundleIconFiles = (NSArray) CFBundlePrimaryIcon.get("CFBundleIconFiles");
//                                    // 获取最大的图标在展示上比较好
//                                    icon = CFBundleIconFiles.getArray()[CFBundleIconFiles.getArray().length - 1].toString();
//                                    if (icon.contains(".png")) {
//                                        icon = icon.replace(".png", "");
//                                    }
//                                    System.out.println("获取icon名称:" + icon);
//                                    break;
//                                }
//                            }
//                        }
//                        break;
//                    }
//                }
//            }
//
//            String[] keyArray = rootDict.allKeys();
//            for (String key : keyArray) {
//                NSObject value = rootDict.objectForKey(key);
//                if (key.equals("CFBundleSignature")) {
//                    continue;
//                }
//                if (value.getClass().equals(NSString.class) || value.getClass().equals(NSNumber.class)) {
//                    resultMap.put(key, value.toString());
//                }
//            }
//
//            String cfBundleName = (String.valueOf(resultMap.get("CFBundleName")) + "icon.png");
//            // 获取上传路径
//            String uploadPath = yaml.getUploadPath().endsWith("/") ? yaml.getUploadPath().substring(0, yaml.getUploadPath().length() - 1) : yaml.getUploadPath();
//            // 所有图标存放在icon文件夹
//            uploadPath += yaml.getIosIconMiddleUrl().endsWith("/") ? yaml.getIosIconMiddleUrl() : yaml.getIosIconMiddleUrl() + "/";
//            // 下载路径如果不存在则创建
//            File dic = new File(uploadPath);
//            if(!dic.exists()){
//                dic.mkdirs();
//            }
//            uploadPath += cfBundleName;
//
//            //根据图标名称下载图标文件到指定位置
//            while ((ze2 = zipIs2.getNextEntry()) != null) {
//                if (!ze2.isDirectory()) {
//                    String name = ze2.getName();
//                    if (icon!=null){
//                        if (name.contains(icon.trim())) {
////                            doc.businessUploadByGateWay()
//                            //图片下载到指定的地方
//                            FileOutputStream fos = new FileOutputStream(uploadPath);
//                            int chunk;
//                            byte[] data = new byte[1024];
//                            while (-1 != (chunk = zipIs2.read(data))) {
//                                fos.write(data, 0, chunk);
//                            }
//                            fos.close();
//                            resultMap.put("iconAddr",uploadPath);
//                            System.out.println("=================下载图片成功");
//                            break;
//                        }
//                    }
//                }
//            }
//            // 处理图片，ipa图片进行了加密，需要解密，否则非Safari浏览器中无法查看
//            PNGConverter.convert(uploadPath, uploadPath);
//            zipIs.close();
//            is.close();
//        } catch (Exception e) {
//            resultMap.put("error", e.getStackTrace());
//        }
//        return resultMap;
//    }

//    /**
//     * 解析 APK 文件
//     * @param is 输入流
//     * @return Map<String,Map<String,Object>>
//     */
//    public static Map<String,Map<String,Object>> analyzeApk(InputStream is,CustomizeYaml yaml) {
//        Map<String,Map<String,Object>> resultMap = new HashMap<>();
//        try {
//            ZipInputStream zipIs = new ZipInputStream(is);
//            zipIs.getNextEntry();
//            AXmlResourceParser parser = new AXmlResourceParser();
//            parser.open(zipIs);
//            boolean flag = true;
//            while(flag) {
//                int type = parser.next();
//                if (type == XmlPullParser.START_TAG) {
//                    int count = parser.getAttributeCount();
//                    String action = parser.getName().toUpperCase();
//                    if(action.equals("MANIFEST") || action.equals("APPLICATION")) {
//                        Map<String,Object> tempMap = new HashMap<>();
//                        for (int i = 0; i < count; i++) {
//                            String name = parser.getAttributeName(i);
//                            String value = parser.getAttributeValue(i);
//                            value = (value == null) ? "" : value;
//                            tempMap.put(name, value);
//                        }
//                        resultMap.put(action, tempMap);
//                    } else {
//                        Map<String,Object> manifest = resultMap.get("MANIFEST");
//                        Map<String,Object> application = resultMap.get("APPLICATION");
//                        if(manifest != null && application != null) {
//                            flag = false;
//                        }
//                        continue;
//                    }
//                }
//            }
//            Map<String, Object> application = resultMap.get("APPLICATION");
//            String iconAddr = String.valueOf(application.get("icon"));
//            zipIs.close();
//            is.close();
//        } catch (ZipException e) {
//            resultMap.put("error", getError(e));
//        } catch (IOException e) {
//            resultMap.put("error", getError(e));
//        } catch (XmlPullParserException e) {
//            resultMap.put("error", getError(e));
//        }
//        return resultMap;
//    }

    private static Map<String,Object> getError(Exception e) {
        Map<String,Object> errorMap = new HashMap<>();
        errorMap.put("cause", e.getCause());
        errorMap.put("message", e.getMessage());
        errorMap.put("stack", e.getStackTrace());
        return errorMap;
    }

}
